#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 
#include <windows.h>
#include <time.h>

void gotoxy(int x,int y)			//光标移动到（x，y）的位置 
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos); 
} 

void HideCursor()					//隐藏光标 
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

int high,width;						//背景大小 
int man_x,man_y;					//男人的位置 
int enemy_x[10],enemy_y[10];		//敌人位置 
int enemy_number=10;				//敌人数量 
int enemy_speed;					//敌人移速 
int starttime,endtime;				//开始时间和结束时间 

void startup()						//数据初始化
{
	high  = 25;						//高 
	width = 35;						//宽 
	
	man_x=high/3;					//男人的位置 
	man_y=width/3;
	
	enemy_speed=10;					//敌人初始移速
	 
	starttime = clock ();			//开始计时 
	
	int k; 
	for (k=0;k<enemy_number;k++)	//随机显示敌人初始位置坐标
	{
		enemy_x[k] = rand() % (high  - 1)+1;
		enemy_y[k] = rand() % (width - 1)+1;
	}
	
	HideCursor();					//隐藏光标 
} 

void show()							//显示界面 
{
	gotoxy(0,0);					//光标移动到原点位置，以下重新清屏  
	
	int i,j,k;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			int isBullet = 0;
			
			for(k=0;k<enemy_number;k++)
			if((i == enemy_x[k]) && (j == enemy_y[k]))
			{
				printf("#");  		//输出敌人 
				isBullet = 1;
			}
			if(!isBullet)
			{
				if((i == man_x) && (j == man_y))
					printf("A"); 	//输出男人 
				else
					printf(" "); 	//输出空格 
			}
		}
		putchar('\n');
	}
	endtime = clock();				//计时结束
	printf("你坚持了%.3f秒\n",(endtime - starttime) / 1000.0);
}

void updatewith()					//与用户输出有关 
{	
	char input;						//控制移动 
	
	if (kbhit())
	{
		input = getch();
		if(input == 'w')			//向上移动 
		man_x--;		
		if(input == 's')			//向下移动
		man_x++;
		if(input == 'a')			//向左移动 
		man_y--;
		if(input == 'd')			//向右移动 
		man_y++;
	}
}

void updatewithout()				//与用户输出无关 
{	
	int i,j,k; 
	static int speed = 0;  
	
	if (speed < enemy_speed)
		speed++;
	if (speed == enemy_speed)
	{
		for(k=0;k<enemy_number;k++)	//控制敌人对男人的追逐 
		{
			if (enemy_x[k] > man_x)
				if (rand() % 3 == 2)
					enemy_x[k]--;
			if (enemy_x[k] < man_x)
				if (rand() % 3 == 2)
					enemy_x[k]++;
			if (enemy_y[k] > man_y)
				if (rand() % 3 == 2)
					enemy_y[k]--;
			if (enemy_y[k] < man_y)
				if (rand() % 3 == 2)
					enemy_y[k]++;
		}
		speed = 0;
	}
	
	if (man_x <= 0)					//控制男人不要飞出界面 
		man_x =  0;
	if (man_x >= high)
		man_x =  high-1;
	if (man_y <= 0)
		man_y =  0;
	if (man_y >= width)
		man_y =  width-1;
		
	for(k=0;k<enemy_number;k++)		//控制敌人不要飞出界面 
	{
		if (enemy_y[k] <= 0)
			enemy_y[k] =  0;
		if (enemy_y[k] >= width - 2)
			enemy_y[k] =  width - 2;
		if (enemy_x[k] <= 1)
			enemy_x[k] =  1;
		if (enemy_x[k] >= high - 2)
			enemy_x[k] =  high - 2;
	}
	
	for (i=0;i<enemy_number;i++)	//控制敌人不要聚集在一个位置 
	for (j=0;j<enemy_number;j++)
	if  (i != j)
		if (enemy_x[i] == enemy_x[j] && enemy_y[i] == enemy_y[j])
			{
			enemy_x[i] += (rand() % 3);
			enemy_y[i] += (rand() % 3);
			}
	
	for(k=0;k<enemy_number;k++)
	if(enemy_x[k] == man_x && enemy_y[k] == man_y)
	{
		puts("游戏结束");
		exit(0);					//游戏结束 
	}
}
 
int main() 
{
	startup();						//数据初始化
	while(1)						//游戏循环执行 
	{
		show();						//显示界面 
		updatewith();				//与用户输出有关 
		updatewithout();			//与用户输出无关 
	} 
	return 0;
}